package com.bx.implatform.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.bx.implatform.dto.*;
import com.bx.implatform.entity.User;
import com.bx.implatform.vo.*;

import java.util.List;

public interface UserService extends IService<User> {

    /**
     * 用户登录
     *
     * @param dto 登录dto
     * @return 登录token
     */
    LoginVO login(LoginDTO dto);

    /**
     * 小程序登录
     *
     * @param dto 登录dto
     * @return 登录token
     */
    LoginVO xcxLogin(XcxLoginDTO dto);


    /**
     * 修改用户密码
     *
     * @param dto 修改密码dto
     */
    void modifyPassword(ModifyPwdDTO dto);

    /**
     * 用refreshToken换取新 token
     *
     * @param refreshToken 刷新token
     * @return 登录token
     */
    LoginVO refreshToken(String refreshToken);

    /**
     * 用户注册
     *
     * @param dto 注册dto
     */
    void register(RegisterDTO dto);

    /**
     * 用户注册
     *
     * @param dto 注册dto
     */
    LoginVO xcxRegister(XcxRegisterDTO dto);

    /**
     * 用户注销
     *
     */
    void unregister();

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User findUserByUserName(String username);

    /**
     * 根据unionId查询用户
     *
     * @param unionId
     * @return 用户信息
     */
    User findUserByUnionId(String unionId);

    /**
     * 根据邀请码查询用户
     *
     * @param inviteCode 邀请码
     * @return 用户信息
     */
    User findUserByInviteCode(String inviteCode);

    /**
     * 更新用户信息，好友昵称和群聊昵称等冗余信息也会更新
     *
     * @param vo 用户信息vo
     */
    void update(UserVO vo);

    /**
     * 根据用户昵id查询用户以及在线状态
     *
     * @param id 用户id
     * @return 用户信息
     */
    UserVO findUserById(Long id);

    /**
     * 根据用户昵称查询用户，最多返回20条数据
     *
     * @param name 用户名或昵称
     * @return 用户列表
     */
    List<UserVO> findUserByName(String name);

    /**
     * 修改用户为在线状态
     *
     * @param userId 用户id
     * @return boolean 是否成功 true成功 false失败
     */
    boolean online(Long userId);

    /**
     * 修改用户为离线状态
     *
     * @param userId 用户id
     * @return boolean 是否成功 true成功 false失败
     */
    boolean offline(Long userId);

    /**
     * 获取用户在线的终端类型
     *
     * @param userIds 用户id，多个用‘,’分割
     * @return 在线用户终端
     */
    List<OnlineTerminalVO> getOnlineTerminals(String userIds);

    /**
     * 上报用户cid
     * @param cid 用户cid
     */
    void reportCid(String cid);

    /**
     *  清理用户cid
     */
    void removeCid();

    /**
     * 查询用户邀请人员列表
     *
     * @param page     页码
     * @param size     页码大小
     * @return 聊天记录列表
     */
    InviteUserListVO findInviteUserList(String beginTime, String endTime, Long page, Long size);

    /**
     * 查询非好友用户列表(按最近登录时间取最新50个用户)
     *
     * @param filterUserIds 需要过滤的用户ids
     * @param sex 性别 0:全部 1:男 2:女
     * @return
     */
    List<User> selectNonFriendUsers(List<Long> filterUserIds, Integer sex);

}
